https://leetcode.com/problems/expression-add-operators/
題目會給一組全部都是數字的字串,還有一個數字target ,請用+、-、*組出能得到target的算式,並回傳所有可能結果

今天的題目一看就知道要用backtracking,但我還是寫不出來就是了
所以今天我就來分享看懂解答的過程,所以先上程式碼吧
class Solution:
    def addOperators(self, num: str, target: int) -> List[str]:
        
        def backtracking(index, prev, curr, n, path):
            if index == len(num):
                
                if target == n and curr == 0:
                    ans.append(''.join(path[1:]))
                return 
            
            curr = curr * 10 + int(num[index])
            
            if curr > 0: #一大坨東西
                backtracking(index+1, prev, curr, n, path)
            
            # 加
            backtracking(index+1, curr, 0, n + curr, path + ['+', str(curr)])
            if path:
                #減
                backtracking(index+1, -curr, 0, n - curr, path + ['-', str(curr)])
                
                #乘
                backtracking(index+1, prev * curr, 0, n - prev + prev * curr, path + ['*', str(curr)])
            
        
        ans = []
        backtracking(0, 0, 0, 0, [])
        
        return ans
那我們就重頭開始吧!
def backtracking(index, prev, curr, n, path)
而這題的結束且有結果的條件有3個:
if index == len(num):
    if target == n and curr == 0:
        ans.append(''.join(path[1:]))
    return 
curr = curr * 10 + int(num[index])
算式裡的curr * 10是因為字串裡的數字不只能當成個位數,也能組成二位數、三位數...
如果curr = 0的話,就是把數字當個位數處理
if curr > 0: #一大坨東西
    backtracking(index+1, prev, curr, n, path)
backtracking(index+1, curr, 0, n + curr, path + ['+', str(curr)])
prev的欄位放curr是因為我們目前的數字對下個backtracking的數字來說是先前數字;curr的欄位放0則可以當成是一個新開始的算式;累積的結果加上去就好
if path的判斷式,可以想成是要有東西可以減才成執行backtracking(index+1, -curr, 0, n - curr, path + ['-', str(curr)])
乘法看起來比較不一樣,在累積結果的部分出現減法是因為乘號的優先度較高,感覺如下面這張圖
backtracking(index+1, prev * curr, 0, n - prev + prev * curr, path + ['*', str(curr)])
連我自己都看不懂我在打什麼了,建議還是自己動手拿紙筆模擬一遍好了
今天的題目是這個月第一次用到回朔法,結果就直接來hard題目了
如果有人和我一樣想不出來只能看解答的
看完後可以試解這題來看看自己是否已理解解答